package com.example.graduatetest.view.model;

import android.app.Activity;
import android.graphics.Color;
import android.view.View;

import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.example.graduatetest.R;
import com.example.graduatetest.bean.Card;
import com.example.graduatetest.databinding.ActivityCardDetailBinding;
import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.utils.ViewPortHandler;

import java.util.ArrayList;
import java.util.List;

public class CardDetailViewModel extends ViewModel {
    private Activity activity;
    private ActivityCardDetailBinding binding;
    private Card ownCard;
    private MutableLiveData<String> time;
    private MutableLiveData<String> class_number;

    private BarChart barChart;
    private PieChart pie;
    private YAxis leftAxis;             //左侧Y轴
    private YAxis rightAxis;            //右侧Y轴
    private XAxis xAxis;                //X轴
    private List<String> XTextList = new ArrayList<>();
    List<PieEntry> pieDataList;
    List<Integer> colors = new ArrayList<>();

    public void init(Activity activity,ActivityCardDetailBinding binding,Card ownCard){
        this.activity = activity;
        this.binding = binding;
        this.ownCard = ownCard;
        barChart = binding.barChart;
        pie = binding.pieChart;
        //初始化列表
        XTextList.add("总数");
        XTextList.add("出勤");
        XTextList.add("迟到");
        XTextList.add("旷课");
        XTextList.add("请假");

        //设置数据
        if(time == null){
            time = new MutableLiveData<>();
            time.setValue("发布时间："+ownCard.getTime());
        }
        if(class_number == null){
            class_number = new MutableLiveData<>();
            class_number.setValue("课程号："+ownCard.getClass_number());
        }

        initBarChart(barChart);
        toolbarInit();
        drawBar();
        drawPie();
    }

    //初始课程
    private void toolbarInit(){
        Toolbar toolbar = binding.toolbar8;
        toolbar.setTitle("考勤统计");
        toolbar.setNavigationIcon(R.drawable.ic_arrow_back_black_24dp);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activity.onBackPressed();
            }
        });

    }

    private void initBarChart(BarChart barChart) {
        /***图表设置***/
        //背景颜色
        barChart.setBackgroundColor(Color.WHITE);
        //不显示图表网格
        barChart.setDrawGridBackground(true);
        //背景阴影
        barChart.setDrawBarShadow(false);
        barChart.setHighlightFullBarEnabled(false);
        //设置动画效果
        barChart.animateY(1000, Easing.Linear);
        barChart.animateX(1000, Easing.Linear);

        //不显示描述信息
        Description description = new Description();
        description.setEnabled(false);
        barChart.setDescription(description);

        //不显示XY线条
        xAxis = barChart.getXAxis();
        leftAxis = barChart.getAxisLeft();
        rightAxis = barChart.getAxisRight();
        xAxis.setDrawAxisLine(false);
        leftAxis.setDrawAxisLine(false);
        leftAxis.setTextSize(12f);

        rightAxis.setDrawAxisLine(false);
        rightAxis.setEnabled(false);
        barChart.setDrawBorders(false);

        //不显示网格线
        barChart.setDrawGridBackground(false);
        //不显示X轴网格线
        xAxis.setDrawGridLines(false);

        //设置X轴显示
        xAxis.setValueFormatter(new IndexAxisValueFormatter(){
            @Override
            public String getFormattedValue(float value) {
                return XTextList.get((int)value);
            }
        });


    }

    private void drawBar(){

        List<BarEntry> barEntries = new ArrayList<>();
        barEntries.add(new BarEntry(0, ownCard.getAll_number()));
        barEntries.add(new BarEntry(1, ownCard.getIn_number()));
        barEntries.add(new BarEntry(2, ownCard.getDelay_number()));
        barEntries.add(new BarEntry(3, ownCard.getOut_number()));
        barEntries.add(new BarEntry(4, ownCard.getAsk_number()));
        colors.add(Color.parseColor("#EC7259"));
        colors.add(Color.parseColor("#FDCD08"));
        colors.add(Color.parseColor("#18AEBD"));
        colors.add(Color.parseColor("#94A6FA"));
        colors.add(Color.parseColor("#3559F4"));
        BarDataSet iBarDataSet = new BarDataSet(barEntries, "打卡情况统计（人）");
        iBarDataSet.setColors(colors);
        iBarDataSet.setValueTextColors(colors);
        iBarDataSet.setValueTextSize(12f);
        iBarDataSet.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                int n = (int)value;
                return n+"人";
            }
        });

        BarData barData = new BarData(iBarDataSet); // 可以添加多个set，即可化成group组
        binding.barChart.setData(barData);
        binding.barChart.setFitBars(true);    // 在bar开头结尾两边添加一般bar宽的留白
        binding.barChart.setDrawValueAboveBar(true);    // 所有值都绘制在柱形外顶部，而不是柱形内顶部。默认true
        binding.barChart.invalidate(); // 刷新

    }

    private void drawPie(){

        pieDataList=new ArrayList<>();

        pieDataList.add(new PieEntry(ownCard.getIn_number(),"出勤"));
        pieDataList.add(new PieEntry(ownCard.getDelay_number(),"迟到"));
        pieDataList.add(new PieEntry(ownCard.getOut_number(),"旷课"));
        pieDataList.add(new PieEntry(ownCard.getAsk_number(),"请假"));

        PieDataSet pieDataSet=new PieDataSet(pieDataList,"");
        PieData pieData=new PieData(pieDataSet);
        pie.setData(pieData);

        pie.setBackgroundColor(Color.WHITE);
        pie.setExtraOffsets(0f,10f,0f,10f);

        //设置各个数据的颜色
        pieDataSet.setColors(colors);
        //实体扇形的空心圆的半径   设置成0时就是一个圆 而不是一个环
        pie.setHoleRadius(0);
        //中间半透明白色圆的半径    设置成0时就是隐藏
        pie.setTransparentCircleRadius(0);
        //设置描述的字体大小（图中的  男性  女性）
        pie.setEntryLabelTextSize(10);
        pie.setEntryLabelColor(Color.BLACK);
        //设置数据的字体大小  （图中的  44     56）
        pieDataSet.setValueTextSize(12);
        //设置描述的位置
        pieDataSet.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
        pieDataSet.setValueLinePart1Length(0.8f);//设置描述连接线长度

        //设置数据的位置
        pieDataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
        pieDataSet.setValueLinePart2Length(0.8f);//设置数据连接线长度
        //设置两根连接线的颜色
        pieDataSet.setValueLineColor(Color.BLACK);


        //对于右下角一串字母的操作
        pie.getDescription().setEnabled(true);                  //是否显示右下角描述
        pie.getDescription().setText("打卡情况统计");    //修改右下角字母的显示
        pie.getDescription().setTextSize(13);                    //字体大小
        pie.getDescription().setTextColor(Color.RED);             //字体颜色




        //数据更新
        pie.notifyDataSetChanged();
        pie.invalidate();

        //动画（如果使用了动画可以则省去更新数据的那一步）
        pie.animateY(3000); //在Y轴的动画  参数是动画执行时间 毫秒为单位
//        line.animateX(2000); //X轴动画
//        line.animateXY(2000,2000);//XY两轴混合动画


    }


    public MutableLiveData<String> getClass_number() {
        return class_number;
    }

    public MutableLiveData<String> getTime() {
        return time;
    }
}
